#ifndef ENTRENADOR_H
#define ENTRENADOR_H

#include <QObject>
#include <QMap>
#include <QDateTime>
#include <QMutex>

#include "midi.h"
#include "interprete.h"
#include "instrumento.h"
#include "registronotas.h"
#include "drummap.h"
#include "proyecto.h"
#include "preferencias.h"

class Entrenador : public QObject
{
	Q_OBJECT

private:
	Entrenador();

public:
	~Entrenador();

	static Entrenador* getInstancia();
    static void destruir();

	void marcarNotaUsuario(quint64 ms, const QString& nombreNota);
	void marcarNotaEntrenamiento(quint64 ms, const QString& nombreNota);

	int getNivelNotaUsuario(const QString& nombreNota);
	int getNivelNotaEntrenamiento(const QString& nombreNota);

    QColor getColorNota(int nota);
    QColor getColorNota(const QString& nombreNota);

	QList<NotaRegistrada> getListaNotasRegistradasUsuario();

	quint64 getMilisegundosDesdeInicio();

    Preferencias& getPreferencias() { return preferencias; }
	
	QStringList getListaNombresPuertosEntrada() {
		return midiIn.getListaNombresPuertosEntrada();
	}

	Instrumento* getInstrumento() {
		return &instrumento;
	}

	Interprete* getInterprete() {
		return &interprete;
	}

    void establecerPreferencias();

	//double getProporcionCompletadoCompas() {
	//	return interprete.getProporcionCompletadoCompas();
	//}

	void arrancar();
	void parar();

	QString getNombreNota(int nota);
    QString getNombreRealNota(const QString& nombreNota);

    Patron getPatronSeleccionado() { return interprete.getPatron(); }

    void seleccionarPatron(int indicePatron);
    void seleccionarCompas(int indiceCompas);

	Proyecto* getProyecto() { return proyecto; }
	void setProyecto(Proyecto* proyecto);


private:
	int getNivelSegunMilisegundos(quint64 msNota);

protected slots:
	void procesarMensajeRecibido(MensajeMidi mensajeMidi);

private:
	Midi midiIn;
	Interprete interprete;
	Instrumento instrumento;
    DrumMap drumMap;
    Preferencias preferencias;

	//QMutex mutexUsuario;
	QMap<QString, quint64> notasUsuario; // Mapa con los ultimos tiempos ejecutados de las notas
	 
	//QMutex mutexEntrenamiento;
	QMap<QString, quint64> notasEntrenamiento; // Mapa con los ultimos tiempos ejecutados de las notas

	RegistroNotas registroNotasUsuario;

	Proyecto* proyecto;

	static Entrenador* instancia;
};

#endif // ENTRENADOR_H
